package controlador;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jcifs.smb.NtlmPasswordAuthentication;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileOutputStream;
import modelo.dominio.*;
import modelo.servicio.Actividades;
import modelo.servicio.Areas;
import modelo.servicio.Documentos;
import org.apache.tomcat.util.http.fileupload.FileItem;
import org.apache.tomcat.util.http.fileupload.FileUploadException;
import org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory;
import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload;

public class ActividadControlador extends HttpServlet {

    private String html = "";
    private int idArea  = 0;

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=ISO-8859-1");
        PrintWriter out = response.getWriter();
        if (request.getSession().getAttribute("sUsuario") == null) {
            response.sendRedirect("front");
        }
        String accion = request.getParameter("ac") == null ? "" : request.getParameter("ac");
        idArea = Integer.parseInt(request.getSession().getAttribute("sArea").toString());
        try {
            if (accion.equals("up")) {
            } else if (accion.equals("to")) {
                List<Actividad> actividades = Actividades.instancia().obtenerPorFechas("01/01/1900", "31/12/2100", idArea);
                if (actividades.isEmpty()) {
                    out.println("<br/><br/>No existen actividades");
                } else {
                    request.setAttribute("actis", actividades);
                    getServletContext().getRequestDispatcher("/jsp/actividad/listado.jsp").forward(request, response);
                }
            } else if (accion.equals("bo")) {
                if (request.getParameter("clv") != null) {
                    Actividades.instancia().eliminar(Integer.parseInt(request.getParameter("clv")));
                }
                out.println("Se inactiv&oacute; exitosamente la Actividad");
            } else if (accion.equals("ok")) {
                List<Actividad> actividades = Actividades.instancia().obtenerPorEstado(idArea, "OK");
                if (actividades.isEmpty()) {
                    out.println("<br/><br/>No existen actividades");
                } else {
                    request.setAttribute("actis", actividades);
                    getServletContext().getRequestDispatcher("/jsp/actividad/listado.jsp").forward(request, response);
                }
            } else if (accion.equals("np")) {
                List<Actividad> actividades = Actividades.instancia().obtenerPorEstado(idArea, "NP");
                if (actividades.isEmpty()) {
                    out.println("<br/><br/>No existen actividades");
                } else {
                    request.setAttribute("actis", actividades);
                    getServletContext().getRequestDispatcher("/jsp/actividad/listado.jsp").forward(request, response);
                }
            } else if (accion.equals("co")) {
                int cond = request.getParameter("cn") == null ? 0 : Integer.parseInt(request.getParameter("cn"));
                List<Actividad> actividades = Actividades.instancia().obtenerPorCondicionante(cond);
                if (actividades.isEmpty()) {
                    out.println("<br/><br/>No existen actividades");
                } else {
                    request.setAttribute("actis", actividades);
                    getServletContext().getRequestDispatcher("/jsp/actividad/listado.jsp").forward(request, response);
                }
            } else if (accion.equals("pv")) {
                List<Actividad> actividades = Actividades.instancia().obtenerPorEstado(idArea, "PV");
                if (actividades.isEmpty()) {
                    out.println("<br/><br/>No existen actividades");
                } else {
                    request.setAttribute("actis", actividades);
                    getServletContext().getRequestDispatcher("/jsp/actividad/listado.jsp").forward(request, response);
                }
            } else if (accion.equals("pd")) {
                List<Actividad> actividades = Actividades.instancia().obtenerPorEstado(idArea, "PD");
                if (actividades.isEmpty()) {
                    out.println("<br/><br/>No existen actividades");
                } else {
                    request.setAttribute("actis", actividades);
                    getServletContext().getRequestDispatcher("/jsp/actividad/listado.jsp").forward(request, response);
                }
            } else if (accion.equals("ct")) {
                html          = "";
//                int total     = Actividades.instancia().obtenerTotal(idArea);
//                int cumplidas = Actividades.instancia().obtenerTotal(idArea, "OK");
//                int vencidas  = Actividades.instancia().obtenerTotal(idArea, "NP");
//                int porVencer = Actividades.instancia().obtenerTotal(idArea, "PV");
//                int pendiente = Actividades.instancia().obtenerTotal(idArea, "PD");

//                html += "<li onclick=\"charge('#centro', 'acti?ac=to');\">"
//                        + "Total Actividades (" + total + ")"
//                        + "</li>"
//                        + "<li onclick=\"charge('#centro', 'acti?ac=ok');\" style=\"background-color: #33FF33;font-weight: bold;\">"
//                        + "Total Cumplidas (" + cumplidas + ")"
//                        + "</li>"
//                        + "</li>"
//                        + "<li onclick=\"charge('#centro', 'acti?ac=np');\" style=\"background-color: red;font-weight: bold;\">"
//                        + "Total Vencidas (" + vencidas + ")"
//                        + "</li>"
//                        + "</li>"
//                        + "<li onclick=\"charge('#centro', 'acti?ac=pv');\" style=\"background-color: yellow;font-weight: bold;\">"
//                        + "Total Por Vencer (" + porVencer + ")"
//                        + "</li>"
//                        + "<li onclick=\"charge('#centro', 'acti?ac=pd');\">"
//                        + "Total Pendientes (" + pendiente + ")"
//                        + "</li>";
                out.println(html);
            } else if (accion.equals("de")) {
                int idAct = Integer.parseInt(request.getParameter("id"));
                ArrayList<Actividad> actis = new ArrayList<Actividad>();
                actis.add(Actividades.instancia().obtener(idAct));
                if (actis.isEmpty()) {
                    out.println("<br/><br/>No existe la actividad");
                } else {
                    request.setAttribute("actis", actis);
                    getServletContext().getRequestDispatcher("/jsp/actividad/listado.jsp").forward(request, response);
                }
            } else if (accion.equals("ls")) {
                String desde = request.getParameter("desde");
                String hasta = request.getParameter("hasta");
                List<Actividad> actividades = Actividades.instancia().obtenerPorFechas(desde, hasta, idArea);
                if (actividades.isEmpty()) {
                    out.println("<br/><br/>Las fechas [<strong>" + desde + " - " + hasta + "</strong>] No registran actividades");
                } else {
                    request.setAttribute("actis", actividades);
                    getServletContext().getRequestDispatcher("/jsp/actividad/listado.jsp").forward(request, response);
                }
            } else if (accion.equals("re")) {
                List<Actividad> actividades = Actividades.instancia().obtenerResumen(idArea);
                if (actividades.isEmpty()) {
                    out.println("<br/><br/>Por el momento no tiene actividades vencidas o por vercer.");
                } else {
                    request.setAttribute("actis", actividades);
                    getServletContext().getRequestDispatcher("/jsp/actividad/listado.jsp").forward(request, response);
                }
            }

            boolean isMultipart = ServletFileUpload.isMultipartContent(request);
            if (isMultipart) {
                try {
                    String nombreArchivo;
                    List<FileItem> items        = null;
                    DiskFileItemFactory factory = new DiskFileItemFactory();
                    factory.setSizeThreshold(10240);
                    factory.setRepository(new File(SeccionControlador.getDirectorioTemporal()));
                    ServletFileUpload upload = new ServletFileUpload(factory);
                    try {
                        items = upload.parseRequest(request);
                    } catch (FileUploadException ex) {
                        out.println("Error de Parsing:" + ex.getMessage());
                    }
                    Documento docu = new Documento();
                    docu.setTipoDoc("CUMP");
                    String valor = "", cump = "NA";
                    Actividad act = null;
                    for (int i = 0; i < items.size(); i++) {
                        FileItem item = (FileItem) items.get(i);
                        if (item.isFormField()) {
                            if (item.getFieldName().equals("id")) {
                                act = Actividades.instancia().obtener(Integer.parseInt(item.getString()));
                                docu.setSeccion(act.getCondicionante().getDocumento().getSeccion());
                                docu.setPrecedente(act.getCondicionante().getDocumento());
                            } else if (item.getFieldName().equals("descripcion")) {
                                docu.setDescripcion(item.getString());
                            } else if (item.getFieldName().equals("carpeta_fisica")) {
                                docu.setLugarFisico(item.getString());
                            } else if (item.getFieldName().equals("f_date")) {
                                valor = item.getString();
                            } else if (item.getFieldName().equals("doc_cump")) {
                                cump = item.getString();
                            }
                        } else {
                            if (!cump.equalsIgnoreCase("NA")) {
                                act.setDocumento(Documentos.instancia().obtenerPorId(cump));
                                act.getHistorico().setUsuarioMod(request.getSession().getAttribute("sUsuario").toString());
                                act.getHistorico().setEstado("OK");
                                Actividades.instancia().cumplir(act);
                                response.sendRedirect(getServletContext().getContextPath());
                            }
                            Area area = Areas.instancia().obtenerPorId(idArea);
                            nombreArchivo  = area.getPlanta().getAbreviacion();
                            nombreArchivo += "-" + area.getAbreviacion();
                            nombreArchivo += "-" + docu.getSeccion().getAbreviacion();
                            nombreArchivo += "-" + docu.getTipoDoc();
                            if (!docu.getTipoDoc().equals("AUTO")) {
                                docu.setFolio(Documentos.instancia().obtenerProxFolio(docu.getTipoDoc(), area.getIdArea()));
                            }
                            nombreArchivo += "-" + docu.getFolio();
                            nombreArchivo += "-";
                            String ffecha  = valor.replace("/", "");
                            nombreArchivo += ffecha;
                            docu.setClave(nombreArchivo);
                            String fileName = item.getName();
                            int desde   = fileName.lastIndexOf(".") > 0 ? fileName.lastIndexOf(".") : fileName.length();
                            String ext  = fileName.substring(desde, fileName.length());
                            String arcc = SeccionControlador.getDirectorioCarga() + docu.getSeccion().getIdSeccion() + "\\" + nombreArchivo + ext;
                            docu.setRuta(arcc);
                            //------------- FUNCIONAL
//                            File fichero = new File(arcc);
//                            item.write(fichero);
                            //------------- TEST
                            NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(SeccionControlador.getUsuarioCIFS());
                            String path   = "smb:" + arcc.replace("\\", "/");
                            SmbFile sFile = new SmbFile(path, auth);
                            SmbFileOutputStream sfos = new SmbFileOutputStream(sFile);
                            sfos.write(item.get());
                            //-------------
                        }
                    }
                    docu.setHistorico(new Historico(request.getSession().getAttribute("sUsuario").toString()));
                    Documentos.instancia().agregar(docu);
                    act.setDocumento(docu);
                    act.getHistorico().setUsuarioMod(request.getSession().getAttribute("sUsuario").toString());
                    act.getHistorico().setEstado("OK");
                    Actividades.instancia().cumplir(act);

                    response.sendRedirect(getServletContext().getContextPath());
                } catch (Exception ex) {
                    out.println("Error en servidor: " + ex.getMessage());
                }
            }
        } catch (Exception e) {
            out.println(e.getMessage());
        } finally {
            out.close();
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
}
